#include "sdk.h"
#include "M_Code_StyledTextCtrl.h"
#include "searchresultslog.h"

namespace {
  const int ID_List = wxNewId();
}

BEGIN_EVENT_TABLE( cbSearchResultsLog, wxEvtHandler )

END_EVENT_TABLE()

cbSearchResultsLog::cbSearchResultsLog( const wxArrayString& titles_in, wxArrayInt& widths_in )
  : ListCtrlLogger( titles_in, widths_in ) {
}

cbSearchResultsLog::~cbSearchResultsLog() {
}

wxWindow* cbSearchResultsLog::CreateControl( wxWindow* parent ) {
  ListCtrlLogger::CreateControl( parent );
  control->SetId( ID_List );
  Connect( ID_List, -1, wxEVT_COMMAND_LIST_ITEM_ACTIVATED,
           ( wxObjectEventFunction )( wxEventFunction )( wxCommandEventFunction )
           &cbSearchResultsLog::OnDoubleClick );
  Manager::Get()->GetAppWindow()->PushEventHandler( this );
  return control;
}

void cbSearchResultsLog::FocusEntry( size_t index ) {
  if( index < ( size_t )control->GetItemCount() ) {
    control->SetItemState( index, wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED, wxLIST_STATE_FOCUSED | wxLIST_STATE_SELECTED );
    control->EnsureVisible( index );
    SyncEditor( index );
  }
}

void cbSearchResultsLog::SyncEditor( int selIndex ) {
  wxFileName filename( control->GetItemText( selIndex ) );
  wxString file;
  if( !filename.IsAbsolute() ) {
    filename.MakeAbsolute( m_Base );
  }
  file = filename.GetFullPath();
  wxListItem li;
  li.m_itemId = selIndex;
  li.m_col = 1;
  li.m_mask = wxLIST_MASK_TEXT;
  control->GetItem( li );
  long line = 0;
  li.m_text.ToLong( &line );
  M_Code_Editor* ed = Manager::Get()->GetEditorManager()->Open( file );
  if( !line || !ed ) {
    return;
  }
  line -= 1;
  ed->Activate();
  ed->GotoLine( line );
  if( M_Code_StyledTextCtrl* ctrl = ed->GetControl() ) {
    ctrl->EnsureVisible( line );
  }
}

void cbSearchResultsLog::OnDoubleClick( M_Code_unused wxCommandEvent& event ) {
  if( control->GetSelectedItemCount() == 0 ) {
    return;
  }
  int index = control->GetNextItem( -1,
                                    wxLIST_NEXT_ALL,
                                    wxLIST_STATE_SELECTED );
  SyncEditor( index );
}
